Micron Document
🎖️GitЯра🎖️


Displaying Raw • Download

feature/widget/src/main/kotlin/org/meshtastic/feature/widget/LocalStatsWidget.kt c8d9795885f5f4edc710db10bc0d366dd72bccbc (c8d97958) Text, 21.32 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.feature.widget

Tff7b72import T7ee787android.annotation.SuppressLint
Tff7b72import T7ee787android.appwidget.AppWidgetManager
Tff7b72import T7ee787android.content.Context
Tff7b72import T7ee787android.content.Intent
Tff7b72import T7ee787android.widget.RemoteViews
Tff7b72import T7ee787androidx.compose.runtime.Composable
Tff7b72import T7ee787androidx.compose.runtime.collectAsState
Tff7b72import T7ee787androidx.compose.runtime.getValue
Tff7b72import T7ee787androidx.compose.ui.graphics.Color
Tff7b72import T7ee787androidx.compose.ui.unit.DpSize
Tff7b72import T7ee787androidx.compose.ui.unit.dp
Tff7b72import T7ee787androidx.compose.ui.unit.sp
Tff7b72import T7ee787androidx.glance.GlanceId
Tff7b72import T7ee787androidx.glance.GlanceModifier
Tff7b72import T7ee787androidx.glance.GlanceTheme
Tff7b72import T7ee787androidx.glance.Image
Tff7b72import T7ee787androidx.glance.ImageProvider
Tff7b72import T7ee787androidx.glance.LocalContext
Tff7b72import T7ee787androidx.glance.LocalSize
Tff7b72import T7ee787androidx.glance.action.clickable
Tff7b72import T7ee787androidx.glance.appwidget.CircularProgressIndicator
Tff7b72import T7ee787androidx.glance.appwidget.GlanceAppWidget
Tff7b72import T7ee787androidx.glance.appwidget.LinearProgressIndicator
Tff7b72import T7ee787androidx.glance.appwidget.SizeMode
Tff7b72import T7ee787androidx.glance.appwidget.action.actionRunCallback
Tff7b72import T7ee787androidx.glance.appwidget.action.actionStartActivity
Tff7b72import T7ee787androidx.glance.appwidget.components.CircleIconButton
Tff7b72import T7ee787androidx.glance.appwidget.components.Scaffold
Tff7b72import T7ee787androidx.glance.appwidget.components.TitleBar
Tff7b72import T7ee787androidx.glance.appwidget.cornerRadius
Tff7b72import T7ee787androidx.glance.appwidget.provideContent
Tff7b72import T7ee787androidx.glance.background
Tff7b72import T7ee787androidx.glance.layout.Alignment
Tff7b72import T7ee787androidx.glance.layout.Column
Tff7b72import T7ee787androidx.glance.layout.Row
Tff7b72import T7ee787androidx.glance.layout.Spacer
Tff7b72import T7ee787androidx.glance.layout.fillMaxSize
Tff7b72import T7ee787androidx.glance.layout.fillMaxWidth
Tff7b72import T7ee787androidx.glance.layout.height
Tff7b72import T7ee787androidx.glance.layout.padding
Tff7b72import T7ee787androidx.glance.layout.size
Tff7b72import T7ee787androidx.glance.layout.width
Tff7b72import T7ee787androidx.glance.text.FontWeight
Tff7b72import T7ee787androidx.glance.text.Text
Tff7b72import T7ee787androidx.glance.text.TextStyle
Tff7b72import T7ee787androidx.glance.unit.ColorProvider
Tff7b72import T7ee787co.touchlab.kermit.Logger
Tff7b72import T7ee787org.jetbrains.compose.resources.stringResource
Tff7b72import T7ee787org.koin.core.component.KoinComponent
Tff7b72import T7ee787org.koin.core.component.inject
Tff7b72import T7ee787org.meshtastic.core.common.util.DateFormatter
Tff7b72import T7ee787org.meshtastic.core.model.ConnectionState
Tff7b72import T7ee787org.meshtastic.core.model.util.formatUptime
Tff7b72import T7ee787org.meshtastic.core.resources.Res
Tff7b72import T7ee787org.meshtastic.core.resources.air_utilization
Tff7b72import T7ee787org.meshtastic.core.resources.battery
Tff7b72import T7ee787org.meshtastic.core.resources.channel_utilization
Tff7b72import T7ee787org.meshtastic.core.resources.connecting
Tff7b72import T7ee787org.meshtastic.core.resources.device_sleeping
Tff7b72import T7ee787org.meshtastic.core.resources.disconnected
Tff7b72import T7ee787org.meshtastic.core.resources.getString
Tff7b72import T7ee787org.meshtastic.core.resources.local_stats_bad
Tff7b72import T7ee787org.meshtastic.core.resources.local_stats_diagnostics_prefix
Tff7b72import T7ee787org.meshtastic.core.resources.local_stats_dropped
Tff7b72import T7ee787org.meshtastic.core.resources.local_stats_heap
Tff7b72import T7ee787org.meshtastic.core.resources.local_stats_heap_value
Tff7b72import T7ee787org.meshtastic.core.resources.local_stats_noise
Tff7b72import T7ee787org.meshtastic.core.resources.local_stats_relays
Tff7b72import T7ee787org.meshtastic.core.resources.local_stats_traffic
Tff7b72import T7ee787org.meshtastic.core.resources.local_stats_updated_at
Tff7b72import T7ee787org.meshtastic.core.resources.meshtastic_app_name
Tff7b72import T7ee787org.meshtastic.core.resources.nodes
Tff7b72import T7ee787org.meshtastic.core.resources.powered
Tff7b72import T7ee787org.meshtastic.core.resources.refresh
Tff7b72import T7ee787org.meshtastic.core.resources.unknown_error
Tff7b72import T7ee787org.meshtastic.core.resources.updated
Tff7b72import T7ee787org.meshtastic.core.resources.uptime

Tff7b72class T56d364LocalStatsWidget Tb4b4b4:
Te6edf3GlanceAppWidgetTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3KoinComponent Tb4b4b4{

Tff7b72override Tff7b72val Te6edf3sizeModeTb4b4b4: Te6edf3SizeMode Tff7b72= Te6edf3SizeModeTb4b4b4.Te6edf3ResponsiveTb4b4b4(Te6edf3RESPONSIVE_SIZESTb4b4b4)
Tff7b72override Tff7b72val Te6edf3previewSizeModeTb4b4b4: Te6edf3androidxTb4b4b4.Te6edf3glanceTb4b4b4.Te6edf3appwidgetTb4b4b4.Te6edf3PreviewSizeMode Tff7b72= Te6edf3SizeModeTb4b4b4.Te6edf3ResponsiveTb4b4b4(Te6edf3RESPONSIVE_SIZESTb4b4b4)

Tff7b72private Tff7b72val Te6edf3stateProviderTb4b4b4: Te6edf3LocalStatsWidgetStateProvider Tff7b72by Te6edf3injectTb4b4b4(Tb4b4b4)

Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffprovideGlanceTb4b4b4(Te6edf3contextTb4b4b4: Te6edf3ContextTb4b4b4, Te6edf3idTb4b4b4: Te6edf3GlanceIdTb4b4b4) Tb4b4b4{
Te6edf3provideContent Tb4b4b4{
Tff7b72val Te6edf3state Tff7b72by Te6edf3stateProviderTb4b4b4.Te6edf3stateTb4b4b4.Te6edf3collectAsStateTb4b4b4(Tb4b4b4)
Te6edf3WidgetContentTb4b4b4(Te6edf3stateTb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffprovidePreviewTb4b4b4(Te6edf3contextTb4b4b4: Te6edf3ContextTb4b4b4, Te6edf3widgetCategoryTb4b4b4: Tffa657IntTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3currentState Tff7b72= Te6edf3stateProviderTb4b4b4.Te6edf3stateTb4b4b4.Te6edf3value

Tff7b72val Te6edf3stateToRender Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3currentStateTb4b4b4.Te6edf3showContent Tff7b72&Tff7b72& Te6edf3currentStateTb4b4b4.Te6edf3nodeShortName Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3currentState
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3createMockWidgetStateTb4b4b4(Tb4b4b4)
Tb4b4b4}
Te6edf3provideContent Tb4b4b4{ Te6edf3WidgetContentTb4b4b4(Te6edf3stateToRenderTb4b4b4) Tb4b4b4}
Tb4b4b4}

T8b949e/**
* Renders our own last-resort UI when the Glance composition throws, replacing Glance's default "Can't show
* content" layout, and logs the failure so a broken widget stops being silent.
*
* Overriding this is the only option available: Glance's `errorUiLayout` constructor parameter is `internal` in
* 1.2.0-rc01, so the approach shown in the official error-handling guide does not compile from outside the library.
* Note that overriding this method means `errorUiLayout` is never read at all.
*
* The message comes from the Crowdin-managed Compose-resources catalog via the project's blocking [getString], so
* it stays translated even though a `RemoteViews` layout cannot reference Compose resources itself.
*/
Tff7b72override Tff7b72fun Td2a8ffonCompositionErrorTb4b4b4(Te6edf3contextTb4b4b4: Te6edf3ContextTb4b4b4, Te6edf3glanceIdTb4b4b4: Te6edf3GlanceIdTb4b4b4, Te6edf3appWidgetIdTb4b4b4: Tffa657IntTb4b4b4, Te6edf3throwableTb4b4b4: Te6edf3ThrowableTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3eTb4b4b4(Te6edf3throwableTb4b4b4) Tb4b4b4{ Ta5d6ff"Ta5d6ffLocalStatsWidget composition failed; rendering error UITa5d6ff" Tb4b4b4}
Tff7b72val Te6edf3errorViews Tff7b72=
Te6edf3RemoteViewsTb4b4b4(Te6edf3contextTb4b4b4.Te6edf3packageNameTb4b4b4, Te6edf3RTb4b4b4.Te6edf3layoutTb4b4b4.Te6edf3widget_composition_errorTb4b4b4)Tb4b4b4.Te6edf3apply Tb4b4b4{
Te6edf3setTextViewTextTb4b4b4(Te6edf3RTb4b4b4.Te6edf3idTb4b4b4.Te6edf3widget_composition_error_textTb4b4b4, Te6edf3getStringTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3unknown_errorTb4b4b4)Tb4b4b4)
Tb4b4b4}
Te6edf3AppWidgetManagerTb4b4b4.Te6edf3getInstanceTb4b4b4(Te6edf3contextTb4b4b4)Tb4b4b4.Te6edf3updateAppWidgetTb4b4b4(Te6edf3appWidgetIdTb4b4b4, Te6edf3errorViewsTb4b4b4)
Tb4b4b4}

Tf0883e@Composable
Tff7b72internal Tff7b72fun Td2a8ffWidgetContentTb4b4b4(Te6edf3stateTb4b4b4: Te6edf3LocalStatsWidgetUiStateTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3context Tff7b72= Te6edf3LocalContextTb4b4b4.Te6edf3current
T8b949e// Mandatory: without this bridge every stringResource call below throws. See WidgetResourceEnvironment.
Te6edf3WidgetResourceEnvironment Tb4b4b4{
Te6edf3GlanceTheme Tb4b4b4{
Te6edf3ScaffoldTb4b4b4(
Te6edf3titleBar Tff7b72= Tb4b4b4{
Te6edf3TitleBarTb4b4b4(
Te6edf3startIcon Tff7b72= Te6edf3ImageProviderTb4b4b4(Te6edf3RTb4b4b4.Te6edf3drawableTb4b4b4.Te6edf3widget_app_iconTb4b4b4)Tb4b4b4,
Te6edf3title Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3meshtastic_app_nameTb4b4b4)Tb4b4b4,
Te6edf3actions Tff7b72= Tb4b4b4{
Te6edf3CircleIconButtonTb4b4b4(
Te6edf3imageProvider Tff7b72= Te6edf3ImageProviderTb4b4b4(Te6edf3RTb4b4b4.Te6edf3drawableTb4b4b4.Te6edf3widget_ic_refreshTb4b4b4)Tb4b4b4,
Te6edf3contentDescription Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3refreshTb4b4b4)Tb4b4b4,
Te6edf3onClick Tff7b72= Te6edf3actionRunCallbackTff7b72<Te6edf3RefreshLocalStatsActionTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3backgroundColor Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3modifier Tff7b72=
Te6edf3GlanceModifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3clickableTb4b4b4(
Te6edf3actionStartActivityTb4b4b4(
Te6edf3contextTb4b4b4.Te6edf3packageManagerTb4b4b4.Te6edf3getLaunchIntentForPackageTb4b4b4(Te6edf3contextTb4b4b4.Te6edf3packageNameTb4b4b4)
Tff7b72?: Te6edf3IntentTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3setClassNameTb4b4b4(Te6edf3contextTb4b4b4.Te6edf3packageNameTb4b4b4, Ta5d6ff"Ta5d6fforg.meshtastic.app.MainActivityTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3stateTb4b4b4.Te6edf3showContentTb4b4b4) Tb4b4b4{
Te6edf3FullStatsContentTb4b4b4(Te6edf3stateTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3DisconnectedTb4b4b4(Te6edf3stateTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tf0883e@Composable
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffMagicNumberTa5d6ff"Tb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffFullStatsContentTb4b4b4(Te6edf3stateTb4b4b4: Te6edf3LocalStatsWidgetUiStateTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3size Tff7b72= Te6edf3LocalSizeTb4b4b4.Te6edf3current
Tff7b72val Te6edf3isNarrow Tff7b72= Te6edf3sizeTb4b4b4.Te6edf3width Tff7b72< T79c0ff1T79c0ff6T79c0ff0.Te6edf3dp
Tff7b72val Te6edf3isShort Tff7b72= Te6edf3sizeTb4b4b4.Te6edf3height Tff7b72< T79c0ff1T79c0ff1T79c0ff0.Te6edf3dp
Tff7b72val Te6edf3isSmall Tff7b72= Te6edf3isNarrow Tff7b72|Tff7b72| Te6edf3isShort
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3GlanceModifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
T8b949e// Main Stats Container
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3GlanceModifierTb4b4b4.Te6edf3defaultWeightTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
T8b949e// Summary Header: Node Chip + Battery
Te6edf3RowTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3GlanceModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4) Tb4b4b4{
Te6edf3stateTb4b4b4.Te6edf3nodeShortNameTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3name Tff7b72-Tff7b72>
Te6edf3stateTb4b4b4.Te6edf3nodeColorsTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3colors Tff7b72-Tff7b72> Te6edf3NodeChipTb4b4b4(Te6edf3shortName Tff7b72= Te6edf3nameTb4b4b4, Te6edf3colors Tff7b72= Te6edf3colorsTb4b4b4) Tb4b4b4}
Tb4b4b4}
Te6edf3SpacerTb4b4b4(Te6edf3GlanceModifierTb4b4b4.Te6edf3widthTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3stateTb4b4b4.Te6edf3hasBatteryTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3isPowered Tff7b72= Te6edf3stateTb4b4b4.Te6edf3batteryLevel Tff7b72> T79c0ff1T79c0ff0T79c0ff0
Tff7b72val Te6edf3batteryValue Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3isPoweredTb4b4b4) Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3poweredTb4b4b4) Tff7b72else Ta5d6ff"Tffd700${Te6edf3stateTb4b4b4.Te6edf3batteryLevelTffd700}Ta5d6ff%Ta5d6ff"
Te6edf3StatRowTb4b4b4(
Te6edf3label Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3batteryTb4b4b4)Tb4b4b4,
Te6edf3value Tff7b72= Te6edf3batteryValueTb4b4b4,
Te6edf3progress Tff7b72= Te6edf3stateTb4b4b4.Te6edf3batteryProgressTb4b4b4,
Te6edf3isSmall Tff7b72= Te6edf3isSmallTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3GlanceModifierTb4b4b4.Te6edf3defaultWeightTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3SpacerTb4b4b4(Te6edf3GlanceModifierTb4b4b4.Te6edf3defaultWeightTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Te6edf3SpacerTb4b4b4(Te6edf3GlanceModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4)

T8b949e// Utilization Stats

Te6edf3RowTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3GlanceModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3StatRowTb4b4b4(
Te6edf3label Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3channel_utilizationTb4b4b4)Tb4b4b4,
Te6edf3value Tff7b72= Ta5d6ff"Ta5d6ff%.1f%%Ta5d6ff"Tb4b4b4.Te6edf3formatTb4b4b4(Te6edf3stateTb4b4b4.Te6edf3channelUtilizationTb4b4b4)Tb4b4b4,
Te6edf3progress Tff7b72= Te6edf3stateTb4b4b4.Te6edf3channelUtilizationProgressTb4b4b4,
Te6edf3isSmall Tff7b72= Te6edf3isSmallTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3GlanceModifierTb4b4b4.Te6edf3defaultWeightTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3end Tff7b72= T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3StatRowTb4b4b4(
Te6edf3label Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3air_utilizationTb4b4b4)Tb4b4b4,
Te6edf3value Tff7b72= Ta5d6ff"Ta5d6ff%.1f%%Ta5d6ff"Tb4b4b4.Te6edf3formatTb4b4b4(Te6edf3stateTb4b4b4.Te6edf3airUtilizationTb4b4b4)Tb4b4b4,
Te6edf3progress Tff7b72= Te6edf3stateTb4b4b4.Te6edf3airUtilizationProgressTb4b4b4,
Te6edf3isSmall Tff7b72= Te6edf3isSmallTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3GlanceModifierTb4b4b4.Te6edf3defaultWeightTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3start Tff7b72= T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}

T8b949e// Detailed Traffic/Relay Stats
Te6edf3SpacerTb4b4b4(Te6edf3GlanceModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3GlanceModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3stateTb4b4b4.Te6edf3hasStatsTb4b4b4) Tb4b4b4{
Te6edf3StatTextTb4b4b4(
Te6edf3stringResourceTb4b4b4(
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3local_stats_trafficTb4b4b4,
Te6edf3stateTb4b4b4.Te6edf3numPacketsTxTb4b4b4,
Te6edf3stateTb4b4b4.Te6edf3numPacketsRxTb4b4b4,
Te6edf3stateTb4b4b4.Te6edf3numRxDupeTb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3isSmallTb4b4b4,
Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3stateTb4b4b4.Te6edf3numTxRelay Tff7b72> T79c0ff0 Tff7b72|Tff7b72| Te6edf3stateTb4b4b4.Te6edf3numTxRelayCanceled Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3StatTextTb4b4b4(
Te6edf3stringResourceTb4b4b4(
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3local_stats_relaysTb4b4b4,
Te6edf3stateTb4b4b4.Te6edf3numTxRelayTb4b4b4,
Te6edf3stateTb4b4b4.Te6edf3numTxRelayCanceledTb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3isSmallTb4b4b4,
Tb4b4b4)
Tb4b4b4}

Tff7b72val Te6edf3diag Tff7b72= Te6edf3mutableListOfTff7b72<Tffa657StringTff7b72>Tb4b4b4(Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3stateTb4b4b4.Te6edf3noiseFloor Tff7b72!Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3diagTb4b4b4.Te6edf3addTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3local_stats_noiseTb4b4b4, Te6edf3stateTb4b4b4.Te6edf3noiseFloorTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3stateTb4b4b4.Te6edf3numPacketsRxBad Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3diagTb4b4b4.Te6edf3addTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3local_stats_badTb4b4b4, Te6edf3stateTb4b4b4.Te6edf3numPacketsRxBadTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3stateTb4b4b4.Te6edf3numTxDropped Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3diagTb4b4b4.Te6edf3addTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3local_stats_droppedTb4b4b4, Te6edf3stateTb4b4b4.Te6edf3numTxDroppedTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3diagTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3StatTextTb4b4b4(
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3local_stats_diagnostics_prefixTb4b4b4, Te6edf3diagTb4b4b4.Te6edf3joinToStringTb4b4b4(Ta5d6ff"Ta5d6ff | Ta5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3isSmallTb4b4b4,
Tb4b4b4)
Tb4b4b4}

Tff7b72val Te6edf3heapProgress Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3stateTb4b4b4.Te6edf3heapTotalBytes Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3stateTb4b4b4.Te6edf3heapFreeBytesTb4b4b4.Te6edf3toFloatTb4b4b4(Tb4b4b4) Tff7b72/ Te6edf3stateTb4b4b4.Te6edf3heapTotalBytes
Tb4b4b4} Tff7b72else Tb4b4b4{
T79c0ff0f
Tb4b4b4}
Tff7b72val Te6edf3heapValue Tff7b72=
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3local_stats_heap_valueTb4b4b4, Te6edf3stateTb4b4b4.Te6edf3heapFreeBytesTb4b4b4, Te6edf3stateTb4b4b4.Te6edf3heapTotalBytesTb4b4b4)
Te6edf3StatRowTb4b4b4(Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3local_stats_heapTb4b4b4)Tb4b4b4, Te6edf3heapValueTb4b4b4, Te6edf3heapProgressTb4b4b4, Te6edf3isSmallTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

T8b949e// Footer (Nodes + Uptime - Pinned to bottom)
Te6edf3FooterTb4b4b4(Te6edf3stateTb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffStatTextTb4b4b4(Te6edf3textTb4b4b4: Tffa657StringTb4b4b4, Te6edf3isSmallTb4b4b4: Tffa657BooleanTb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3textTb4b4b4,
Te6edf3style Tff7b72= Te6edf3TextStyleTb4b4b4(Te6edf3color Tff7b72= Te6edf3GlanceThemeTb4b4b4.Te6edf3colorsTb4b4b4.Te6edf3onSurfaceVariantTb4b4b4, Te6edf3fontSize Tff7b72= Tff7b72if Tb4b4b4(Te6edf3isSmallTb4b4b4) T79c0ff9.Te6edf3sp Tff7b72else T79c0ff1T79c0ff0.Te6edf3spTb4b4b4)Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3GlanceModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}

Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffDisconnectedTb4b4b4(Te6edf3stateTb4b4b4: Te6edf3LocalStatsWidgetUiStateTb4b4b4) Tb4b4b4{
Te6edf3ColumnTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3GlanceModifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4,
Te6edf3horizontalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterHorizontallyTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3stateTb4b4b4.Te6edf3isConnectingTb4b4b4) Tb4b4b4{
Te6edf3CircularProgressIndicatorTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3GlanceModifierTb4b4b4.Te6edf3sizeTb4b4b4(T79c0ff2T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3ImageTb4b4b4(
Te6edf3provider Tff7b72= Te6edf3ImageProviderTb4b4b4(Te6edf3RTb4b4b4.Te6edf3drawableTb4b4b4.Te6edf3widget_app_iconTb4b4b4)Tb4b4b4,
Te6edf3contentDescription Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3GlanceModifierTb4b4b4.Te6edf3sizeTb4b4b4(T79c0ff3T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3statusText Tff7b72=
Tff7b72when Tb4b4b4(Te6edf3stateTb4b4b4.Te6edf3connectionStateTb4b4b4) Tb4b4b4{
Tff7b72is Te6edf3ConnectionStateTb4b4b4.Te6edf3Disconnected Tff7b72-Tff7b72> Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3disconnectedTb4b4b4)
Tff7b72is Te6edf3ConnectionStateTb4b4b4.Te6edf3Connecting Tff7b72-Tff7b72> Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3connectingTb4b4b4)
Tff7b72is Te6edf3ConnectionStateTb4b4b4.Te6edf3DeviceSleep Tff7b72-Tff7b72> Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3device_sleepingTb4b4b4)
Tff7b72is Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected Tff7b72-Tff7b72> Ta5d6ff"Ta5d6ff"
Tb4b4b4}
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3statusTextTb4b4b4,
Te6edf3style Tff7b72=
Te6edf3TextStyleTb4b4b4(
Te6edf3color Tff7b72= Te6edf3GlanceThemeTb4b4b4.Te6edf3colorsTb4b4b4.Te6edf3onSurfaceVariantTb4b4b4,
Te6edf3fontSize Tff7b72= T79c0ff1T79c0ff2.Te6edf3spTb4b4b4,
Te6edf3fontWeight Tff7b72= Te6edf3FontWeightTb4b4b4.Te6edf3MediumTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4)
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffFooterTb4b4b4(Te6edf3stateTb4b4b4: Te6edf3LocalStatsWidgetUiStateTb4b4b4) Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3GlanceModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3RowTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3GlanceModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3top Tff7b72= T79c0ff2.Te6edf3dpTb4b4b4, Te6edf3bottom Tff7b72= T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3GlanceModifierTb4b4b4.Te6edf3defaultWeightTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3horizontalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3StartTb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3nodesTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3TextStyleTb4b4b4(Te6edf3color Tff7b72= Te6edf3GlanceThemeTb4b4b4.Te6edf3colorsTb4b4b4.Te6edf3onSurfaceVariantTb4b4b4, Te6edf3fontSize Tff7b72= T79c0ff1T79c0ff0.Te6edf3spTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Ta5d6ff"Tffd700${Te6edf3stateTb4b4b4.Te6edf3onlineNodesTffd700}Ta5d6ff/Tffd700${Te6edf3stateTb4b4b4.Te6edf3totalNodesTffd700}Ta5d6ff"Tb4b4b4,
Te6edf3maxLines Tff7b72= T79c0ff1Tb4b4b4,
Te6edf3style Tff7b72=
Te6edf3TextStyleTb4b4b4(
Te6edf3color Tff7b72= Te6edf3GlanceThemeTb4b4b4.Te6edf3colorsTb4b4b4.Te6edf3onSurfaceTb4b4b4,
Te6edf3fontSize Tff7b72= T79c0ff1T79c0ff1.Te6edf3spTb4b4b4,
Te6edf3fontWeight Tff7b72= Te6edf3FontWeightTb4b4b4.Te6edf3MediumTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3GlanceModifierTb4b4b4.Te6edf3defaultWeightTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3horizontalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3EndTb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3uptimeTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3TextStyleTb4b4b4(Te6edf3color Tff7b72= Te6edf3GlanceThemeTb4b4b4.Te6edf3colorsTb4b4b4.Te6edf3onSurfaceVariantTb4b4b4, Te6edf3fontSize Tff7b72= T79c0ff1T79c0ff0.Te6edf3spTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3formatUptimeTb4b4b4(Te6edf3stateTb4b4b4.Te6edf3uptimeSecsTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3maxLines Tff7b72= T79c0ff1Tb4b4b4,
Te6edf3style Tff7b72=
Te6edf3TextStyleTb4b4b4(
Te6edf3color Tff7b72= Te6edf3GlanceThemeTb4b4b4.Te6edf3colorsTb4b4b4.Te6edf3onSurfaceTb4b4b4,
Te6edf3fontSize Tff7b72= T79c0ff1T79c0ff1.Te6edf3spTb4b4b4,
Te6edf3fontWeight Tff7b72= Te6edf3FontWeightTb4b4b4.Te6edf3MediumTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3RowTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3GlanceModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3horizontalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterHorizontallyTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3updatedLabel Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3updatedTb4b4b4)
Tff7b72val Te6edf3updatedText Tff7b72=
Te6edf3stringResourceTb4b4b4(
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3local_stats_updated_atTb4b4b4,
Te6edf3DateFormatterTb4b4b4.Te6edf3formatShortDateTb4b4b4(Te6edf3stateTb4b4b4.Te6edf3updateTimeMillisTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3footerText Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3updatedLabelTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Ta5d6ff"Tffd700$Te6edf3updatedLabelTa5d6ff Tffd700$Te6edf3updatedTextTa5d6ff"
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3updatedText
Tb4b4b4}
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3footerTextTb4b4b4,
Te6edf3style Tff7b72= Te6edf3TextStyleTb4b4b4(Te6edf3color Tff7b72= Te6edf3GlanceThemeTb4b4b4.Te6edf3colorsTb4b4b4.Te6edf3onSurfaceVariantTb4b4b4, Te6edf3fontSize Tff7b72= T79c0ff8.Te6edf3spTb4b4b4)Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3GlanceModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3bottom Tff7b72= T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3maxLines Tff7b72= T79c0ff1Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tf0883e@SuppressLintTb4b4b4(Ta5d6ff"Ta5d6ffRestrictedApiTa5d6ff"Tb4b4b4)
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffNodeChipTb4b4b4(Te6edf3shortNameTb4b4b4: Tffa657StringTb4b4b4, Te6edf3colorsTb4b4b4: Te6edf3PairTff7b72<Tffa657IntTb4b4b4, Tffa657IntTff7b72>Tb4b4b4, Te6edf3modifierTb4b4b4: Te6edf3GlanceModifier Tff7b72= Te6edf3GlanceModifierTb4b4b4) Tb4b4b4{
Tff7b72val Tb4b4b4(Te6edf3fgTb4b4b4, Te6edf3bgTb4b4b4) Tff7b72= Te6edf3colors
Te6edf3RowTb4b4b4(
Te6edf3modifier Tff7b72=
Te6edf3modifier
Tb4b4b4.Te6edf3widthTb4b4b4(T79c0ff6T79c0ff4.Te6edf3dpTb4b4b4)
Tb4b4b4.Te6edf3backgroundTb4b4b4(Te6edf3ColorTb4b4b4(Te6edf3bgTb4b4b4)Tb4b4b4)
Tb4b4b4.Te6edf3cornerRadiusTb4b4b4(T79c0ff4.Te6edf3dpTb4b4b4)
Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3horizontal Tff7b72= T79c0ff6.Te6edf3dpTb4b4b4, Te6edf3vertical Tff7b72= T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4,
Te6edf3horizontalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterHorizontallyTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3shortNameTb4b4b4,
Te6edf3style Tff7b72= Te6edf3TextStyleTb4b4b4(Te6edf3color Tff7b72= Te6edf3ColorProviderTb4b4b4(Te6edf3ColorTb4b4b4(Te6edf3fgTb4b4b4)Tb4b4b4)Tb4b4b4, Te6edf3fontSize Tff7b72= T79c0ff1T79c0ff1.Te6edf3spTb4b4b4, Te6edf3fontWeight Tff7b72= Te6edf3FontWeightTb4b4b4.Te6edf3BoldTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffStatRowTb4b4b4(
Te6edf3labelTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3valueTb4b4b4: Tffa657String?Tb4b4b4,
Te6edf3progressTb4b4b4: Tffa657FloatTb4b4b4,
Te6edf3isSmallTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3modifierTb4b4b4: Te6edf3GlanceModifier Tff7b72= Te6edf3GlanceModifierTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3vertical Tff7b72= T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3RowTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3GlanceModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3labelTb4b4b4,
Te6edf3style Tff7b72=
Te6edf3TextStyleTb4b4b4(
Te6edf3color Tff7b72= Te6edf3GlanceThemeTb4b4b4.Te6edf3colorsTb4b4b4.Te6edf3onSurfaceVariantTb4b4b4,
Te6edf3fontSize Tff7b72= Tff7b72if Tb4b4b4(Te6edf3isSmallTb4b4b4) T79c0ff1T79c0ff0.Te6edf3sp Tff7b72else T79c0ff1T79c0ff1.Te6edf3spTb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3GlanceModifierTb4b4b4.Te6edf3defaultWeightTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3valueTff7b72?.Te6edf3let Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Tffa657itTb4b4b4,
Te6edf3style Tff7b72=
Te6edf3TextStyleTb4b4b4(
Te6edf3color Tff7b72= Te6edf3GlanceThemeTb4b4b4.Te6edf3colorsTb4b4b4.Te6edf3onSurfaceTb4b4b4,
Te6edf3fontSize Tff7b72= T79c0ff1T79c0ff0.Te6edf3spTb4b4b4,
Te6edf3fontWeight Tff7b72= Te6edf3FontWeightTb4b4b4.Te6edf3MediumTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3SpacerTb4b4b4(Te6edf3GlanceModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3LinearProgressIndicatorTb4b4b4(
Te6edf3progress Tff7b72= Te6edf3progressTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3GlanceModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3heightTb4b4b4(T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4.Te6edf3cornerRadiusTb4b4b4(T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3color Tff7b72= Te6edf3GlanceThemeTb4b4b4.Te6edf3colorsTb4b4b4.Te6edf3primaryTb4b4b4,
Te6edf3backgroundColor Tff7b72= Te6edf3GlanceThemeTb4b4b4.Te6edf3colorsTb4b4b4.Te6edf3surfaceVariantTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72companion Tff7b72object Tb4b4b4{
Tff7b72private Tff7b72val Te6edf3SMALL_SQUARE Tff7b72= Te6edf3DpSizeTb4b4b4(T79c0ff1T79c0ff0T79c0ff0.Te6edf3dpTb4b4b4, T79c0ff1T79c0ff0T79c0ff0.Te6edf3dpTb4b4b4)
Tff7b72private Tff7b72val Te6edf3HORIZONTAL_RECTANGLE Tff7b72= Te6edf3DpSizeTb4b4b4(T79c0ff2T79c0ff5T79c0ff0.Te6edf3dpTb4b4b4, T79c0ff1T79c0ff0T79c0ff0.Te6edf3dpTb4b4b4)
Tff7b72private Tff7b72val Te6edf3BIG_SQUARE Tff7b72= Te6edf3DpSizeTb4b4b4(T79c0ff2T79c0ff5T79c0ff0.Te6edf3dpTb4b4b4, T79c0ff2T79c0ff5T79c0ff0.Te6edf3dpTb4b4b4)

Tff7b72private Tff7b72val Te6edf3RESPONSIVE_SIZES Tff7b72= Te6edf3setOfTb4b4b4(Te6edf3SMALL_SQUARETb4b4b4, Te6edf3HORIZONTAL_RECTANGLETb4b4b4, Te6edf3BIG_SQUARETb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72internal Tff7b72fun Td2a8ffcreateMockWidgetStateTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3LocalStatsWidgetUiStateTb4b4b4(
Te6edf3connectionState Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectedTb4b4b4,
Te6edf3showContent Tff7b72= Tff7b72trueTb4b4b4,
Te6edf3nodeShortName Tff7b72= Ta5d6ff"Ta5d6ffMETa5d6ff"Tb4b4b4,
Te6edf3nodeColors Tff7b72= T79c0ff0Te6edf3xFFFFFFFFTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4) Te6edf3to T79c0ff0Te6edf3xFF000000Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3batteryLevel Tff7b72= T79c0ff8T79c0ff5Tb4b4b4,
Te6edf3hasBattery Tff7b72= Tff7b72trueTb4b4b4,
Te6edf3batteryProgress Tff7b72= T79c0ff0.85fTb4b4b4,
Te6edf3channelUtilization Tff7b72= T79c0ff1T79c0ff8.5fTb4b4b4,
Te6edf3channelUtilizationProgress Tff7b72= T79c0ff0.185fTb4b4b4,
Te6edf3airUtilization Tff7b72= T79c0ff3.2fTb4b4b4,
Te6edf3airUtilizationProgress Tff7b72= T79c0ff0.032fTb4b4b4,
Te6edf3hasStats Tff7b72= Tff7b72trueTb4b4b4,
Te6edf3numPacketsTx Tff7b72= T79c0ff1T79c0ff4T79c0ff5Tb4b4b4,
Te6edf3numPacketsRx Tff7b72= T79c0ff8T79c0ff9T79c0ff2Tb4b4b4,
Te6edf3numRxDupe Tff7b72= T79c0ff4T79c0ff2Tb4b4b4,
Te6edf3totalNodes Tff7b72= T79c0ff3Tb4b4b4,
Te6edf3onlineNodes Tff7b72= T79c0ff2Tb4b4b4,
Te6edf3uptimeSecs Tff7b72= T79c0ff1T79c0ff7T79c0ff2T79c0ff8T79c0ff0T79c0ff0LTb4b4b4,
Te6edf3updateTimeMillis Tff7b72= Te6edf3SystemTb4b4b4.Te6edf3currentTimeMillisTb4b4b4(Tb4b4b4) Tff7b72- T79c0ff3T79c0ff0T79c0ff0T79c0ff0T79c0ff0T79c0ff0LTb4b4b4,
Tb4b4b4)

Served by rngit 1.5.0 - Generated in 0.13s